// 导入express 模块
const express = require("express");

const session = require("express-session");

/*
    session的使用：
    1. 安装express-session模块：npm install express-session --save
    2. 在应用中引入express-session模块：const session = require("express-session");
    3. 使用session中间件：app.use(session(options))
    选项包括：
        - secret: 用于加密session的字符串
        - resave: 强制保存session，即使它没有被修改
        - saveUninitialized: 强制保存未初始化的session
        - cookie: 设置cookie的选项，如maxAge、httpOnly、secure等
    4. 在路由处理函数中访问session数据：req.session
    5. 在路由处理函数中设置session数据：req.session.key = value
    6. 在路由处理函数中删除session数据：delete req.session.key
    7. 在路由处理函数中检查session数据是否存在：if (req.session.key) { ... }
    8. 在路由处理函数中清除session：req.session.destroy(callback)
    9. 在路由处理函数中获取session ID：req.sessionID
*/

// 2. 创建express的服务器实例
const app = express();

// 3. 配置session中间件
app.use(session({
    secret: "keyboard cat", // 用于加密session的字符串
    resave: false, // 强制保存session，即使它没有被修改
    saveUninitialized: true, // 强制保存未初始化的session
    cookie: {
        maxAge: 1000 * 60 * 60 * 24, // 设置cookie的过期时间为1天
        httpOnly: true, // 设置cookie的httpOnly标志，防止客户端脚本访问cookie
        secure: false // 设置cookie的secure标志，true表示只在HTTPS连接中传输cookie
    } // 设置cookie的安全标志
}));

app.get("/", (req, res) => {
    // 访问首页时，检查session中是否有username
    if (req.session.username) {
        // 如果有，说明用户已登录
        return res.send(`欢迎回来，${req.session.username}`);
    }
    // 如果没有，说明用户未登录
    res.send("用户未登录");
});

app.get("/login", (req, res) => {
    // 模拟登录操作，设置session数据
    req.session.username = "zhangsan"; // 设置session中的username
    res.send("登录成功");
});

app.get("/logout", (req, res) => {
    // 1. 设置session的过期时间为0，清除session数据（它会把所有的session都销毁）
    // req.session.cookie.maxAge = 0; // 设置cookie的过期时间为0，清除cookie
    // res.send("登出成功");

    // 2. 指定session的值为null，清除session数据
    // req.session.username = null; // 设置session中的username为null，清除session数据
    // res.send("登出成功");

    // 3. 或者直接调用req.session.destroy方法清除session数据
    // 模拟登出操作，清除session数据
    req.session.destroy(err => {
        if (err) {
            return res.send("登出失败");
        }
        res.send("登出成功");
    });
});

// 调用app.listen方法，指定端口号并启动web服务器
app.listen(80, function() {
  console.log(`Express server running at http://127.0.0.1`);
});